#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>

volatile bool flag = false;

void handler(int signo) {
    std::cout << "get a sig: " << signo << std::endl;
    flag = true;
}

int main() {
    signal(SIGINT, handler);

    while (!flag);

    std::cout << "Process quit..." << std::endl;
    return 0;
}





// void PrintPending(sigset_t& pending) {
//     std::cout << "current process pending: ";
//     // 最左边为31号信号，最右边为1号信号
//     for (int signo = 31; signo >= 1; signo--)
//         if (sigismember(&pending, signo))
//             std::cout << 1;
//         else
//             std::cout << 0;
//     std::cout << std::endl;
// }

// void handler(int sig) {
//     std::cout << "get a sig: " << sig << std::endl;
//     while (true) {
//         sigset_t pending;
//         sigpending(&pending);
//         PrintPending(pending);
//         sleep(1);
//     }
// }

// int main() {
//     struct sigaction act, oact;
//     // 设置handler方法
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     // 将3号信号同时屏蔽
//     sigaddset(&act.sa_mask, 3);
//     act.sa_flags = 0;
//     sigaction(2, &act, &oact);

//     while (true) {
//         std::cout << "I am a process, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// int main() {
//     int signo;
//     signal(signo, handler); // handler 为我们自定义的方法
//     signal(signo, SIG_IGN); // SIG_IGN 为忽略
//     signal(signo, SIG_DFL); // SIG_DFL 为默认

//     return 0;
// }


// void PrintPending(sigset_t& pending) {
//     std::cout << "current process pending: ";
//     // 最左边为31号信号，最右边为1号信号
//     for (int signo = 31; signo >= 1; signo--)
//         if (sigismember(&pending, signo))
//             std::cout << 1;
//         else
//             std::cout << 0;
//     std::cout << std::endl;
// }

// void handler(int signo) {
//     std::cout << signo << " 号信号已被递达！！" << std::endl;
//     std::cout << "----------------------------------------" << std::endl;
//     sigset_t pending;
//     sigpending(&pending);
//     PrintPending(pending);
//     std::cout << "----------------------------------------" << std::endl;
// }

// int main() {
//     // 先将2号信号的方法修改
//     signal(SIGINT, handler);
//     sigset_t block_set, old_set;
//     // 先将位图给清空
//     sigemptyset(&block_set);
//     sigemptyset(&old_set);

//     // 屏蔽我们的二号信号，先在set中设置对应的2号信号
//     sigaddset(&block_set, SIGINT);
//     sigprocmask(SIG_BLOCK, &block_set, &old_set);
//     int cnt = 10;
//     while (true) {
//         // 获取当前pending位图
//         sigset_t pending;
//         sigpending(&pending);
//         PrintPending(pending);
//         sleep(1);
//         if (cnt == 0) {
//             // 将二号信号的屏蔽字取消
//             sigprocmask(SIG_SETMASK, &old_set, &block_set);
//         }
//         cnt--;
//     }
//     return 0;
// }




// int main() {
//     // 创建出子进程
//     pid_t id = fork();
//     if (id == 0) {
//         int a = 10;
//         int b = a / 0;
//         exit(0);
//     }
//     sigset_t s;
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if (rid > 0) {
//         std::cout << "exit code: " << ((status >> 8) & 0xFF) << std::endl;
//         std::cout << "exit sig: " << (status & 0x7F) << std::endl;
//         std::cout << "core dump: " << ((status >> 7) & 0x1) << std::endl;

//     }
//     return 0;
// }